iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
Mobile Development

[Android Studio & Spring boot 30天挑戰]系列 第 5

[Android Studio & Spring boot 30天挑戰] Day05 - 摩斯轉換(下)

  • 分享至 

  • xImage
  •  

在前幾天的挑戰中,我們開始介紹了一個有趣而實用的功能:摩斯密碼轉換。這個功能允許使用者將文字訊息轉換成摩斯密碼,並將摩斯密碼解碼回原始文字。而今天要接續昨天的功能繼續介紹轉換的寫法,那就直接進入介紹吧!!!!/images/emoticon/emoticon05.gif

UI畫面

還記得昨天的 APP 畫面吧,因為有著兩種的轉換方式。
https://ithelp.ithome.com.tw/upload/images/20230816/20150369E1YtqU4t5x.pnghttps://ithelp.ithome.com.tw/upload/images/20230816/20150369nglhvq2zoh.png

程式碼

首先是轉換按鈕的寫法,這裡的 if else 是用來判斷是哪個模式的,這邊比較不一樣是在英文轉摩斯密碼的地方,因為這個模式的輸入需要用到鍵盤,所以在按下轉換按鈕時我讓他把鍵盤給關掉。

    /**enter點擊*/
    private void enterIconClicked(View view) {
        if(isChange) {
            morseTransformPresenter.morseCodeTransformEnglish(String.valueOf(input_editText.getText()));
        } else {
            if(!String.valueOf(input_editText.getText()).equals("")) {
                morseTransformPresenter.englishTransformMorseCode(String.valueOf(input_editText.getText()));
                //用來隱藏鍵盤
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(input_editText.getWindowToken(), 0);
                input_editText.clearFocus();
            }
        }
    }

這邊也寫了一個如果點擊螢幕就會隱藏鍵盤的小方法。

 /**點擊螢幕,關閉鍵盤*/
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        View focusedView = getCurrentFocus();
        if (focusedView != null) {
            imm.hideSoftInputFromWindow(focusedView.getWindowToken(), 0);
        }
        return super.onTouchEvent(event);
    }

接下來就是轉換的部分了,因為我使用的是 MVP 所以會在 Presenter 裡做邏輯處理,然後才將會面要更新的資料傳回給 View。

首先是 摩斯密碼轉英文的部分,我會上註解在程式碼上。

@Override
public void morseCodeTransformEnglish(String inputText) {
    StringBuilder morseCodeStringBuilder = new StringBuilder(); // 用於構建摩斯密碼的 StringBuilder
    StringBuilder outputMorseCodeStringBuilder = new StringBuilder(); // 用於構建最終轉換結果的 StringBuilder

    for (String text : inputText.split("")) { // 遍歷 inputText 中的每個字符
        if (!text.equals("/") && !text.equals(" ")) { // 如果字符不是斜杠和空格
            morseCodeStringBuilder.append(text); // 將字符附加到 morseCodeStringBuilder 中
        } else if (text.equals(" ")) { // 如果字符是空格,表示單詞之間的間隔
            if (morseCodeStringBuilder.length() > 0 && !morseCodeStringBuilder.substring(0, 1).equals(" ")) { // 如果 morseCodeStringBuilder 不為空且不以空格開頭
                if (morseCodeTool.getEnglishToMorseCode().get(morseCodeStringBuilder.toString()) == null) {
                    outputMorseCodeStringBuilder.append("§").append(" "); // 無效摩斯密碼,附加特殊符號 §
                    morseCodeStringBuilder.setLength(0); // 清空 morseCodeStringBuilder
                } else {
                    outputMorseCodeStringBuilder.append(morseCodeTool.getEnglishToMorseCode().get(morseCodeStringBuilder.toString())); // 將摩斯密碼轉換為英文並附加到 outputMorseCodeStringBuilder 中
                    morseCodeStringBuilder.setLength(0); // 清空 morseCodeStringBuilder
                }
            }
        } else { // 如果字符是斜杠
            if (morseCodeStringBuilder.length() > 0) {
                String firstText = Character.toString(morseCodeStringBuilder.charAt(0)); // 取得 morseCodeStringBuilder 的第一個字符
                if (firstText.equals("/")) { // 如果第一個字符是斜杠,表示無效字符
                    morseCodeStringBuilder.setLength(0); // 清空 morseCodeStringBuilder
                } else {
                    if (morseCodeTool.getEnglishToMorseCode().get(morseCodeStringBuilder.toString()) == null) {
                        outputMorseCodeStringBuilder.append("§").append(" "); // 無效摩斯密碼,附加特殊符號 §
                        morseCodeStringBuilder.setLength(0); // 清空 morseCodeStringBuilder
                    } else {
                        outputMorseCodeStringBuilder.append(morseCodeTool.getEnglishToMorseCode().get(morseCodeStringBuilder.toString())).append(" "); // 將摩斯密碼轉換為英文並附加到 outputMorseCodeStringBuilder 中
                        morseCodeStringBuilder.setLength(0); // 清空 morseCodeStringBuilder
                    }
                }
            }
        }
    }

    if (morseCodeStringBuilder.length() > 0) {
        String firstText = Character.toString(morseCodeStringBuilder.charAt(0)); // 取得 morseCodeStringBuilder 的第一個字符
        if (!firstText.equals(" ") && !firstText.equals("/")) { // 如果第一個字符不是空格和斜杠
            if (morseCodeTool.getEnglishToMorseCode().get(morseCodeStringBuilder.toString()) == null) {
                outputMorseCodeStringBuilder.append("§"); // 無效摩斯密碼,附加特殊符號 §
            } else {
                outputMorseCodeStringBuilder.append(morseCodeTool.getEnglishToMorseCode().get(morseCodeStringBuilder.toString())); // 將摩斯密碼轉換為英文並附加到 outputMorseCodeStringBuilder 中
            }
        }
    }

    view.getTranslationCompleted(outputMorseCodeStringBuilder.toString()); // 調用回調方法,將最終轉換結果傳遞給 view
}

最後是英文轉摩斯密碼的部分,一樣註解在程式碼上。

@Override
public void englishTransformMorseCode(String inputText) {
    StringBuilder outputMorseCodeStringBuilder = new StringBuilder(); // 用於構建摩斯密碼的 StringBuilder
    StringBuilder checkBlankStringBuilder = new StringBuilder(); // 用於檢查空格的 StringBuilder
    String firstText = ""; // 用於存儲第一個字符

    for (String text : inputText.split("")) { // 遍歷 inputText 中的每個字符
        if (!text.equals("\n")) { // 如果字符不是換行符
            if (checkBlankStringBuilder.length() != 0) { // 如果 checkBlankStringBuilder 不為空
                firstText = Character.toString(checkBlankStringBuilder.charAt(0)); // 取得 checkBlankStringBuilder 的第一個字符
            }
            if (text.equals(" ")) { // 如果字符是空格
                if (!firstText.equals(" ")) { // 如果第一個字符不是空格
                    outputMorseCodeStringBuilder.append("/"); // 添加斜杠表示單詞之間的間隔
                    checkBlankStringBuilder.append(" "); // 添加空格到 checkBlankStringBuilder 中
                }
            } else { // 如果字符不是空格
                if (morseCodeTool.getMorseCodeList().get(text) == null) { // 檢查字符是否為有效的摩斯密碼
                    outputMorseCodeStringBuilder.append("§"); // 無效摩斯密碼,附加特殊符號 §
                    outputMorseCodeStringBuilder.append(" "); // 添加空格
                } else {
                    outputMorseCodeStringBuilder.append(morseCodeTool.getMorseCodeList().get(text)); // 將字符轉換為摩斯密碼並附加到 outputMorseCodeStringBuilder 中
                    outputMorseCodeStringBuilder.append(" "); // 添加空格
                    checkBlankStringBuilder.setLength(0); // 清空 checkBlankStringBuilder
                }
                firstText = ""; // 清空 firstText
            }
        }
    }

    if (outputMorseCodeStringBuilder.length() != 0) { // 如果有轉換結果
        outputMorseCodeStringBuilder.deleteCharAt(outputMorseCodeStringBuilder.length() - 1); // 刪除最後一個多餘的空格
        view.getTranslationCompleted(outputMorseCodeStringBuilder.toString()); // 調用回調方法,將最終轉換結果傳遞給 view
    }
}

這就是摩斯密碼轉換的部分拉,明天會繼續介紹下一個功能~!!!!!!


上一篇
[Android Studio & Spring boot 30天挑戰] Day04 - 摩斯轉換(上)
下一篇
[Android Studio & Spring boot 30天挑戰] Day06 - 指南針
系列文
[Android Studio & Spring boot 30天挑戰]30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言